import * as express from 'express';
import * as path from 'path';
import {Server} from "ws";

const app = express();

export class Product {
    constructor(
        public id: number,
        public title: string,
        public price: number,
        public rating: number,
        public desc: string,
        public categories: Array<string>
    ) { }
}

export class Comment {
    constructor(
        public id: number,
        public productId: number,
        public timestamp: string,
        public user: string,
        public rating: number,
        public content: string
) { }
}

const products: Product[] = [
    new Product(1,"第一个商品",1.99,2.5, "这是第一个残品，是我学习angular入门创建的",["电子产品","硬件产品"]),
    new Product(2,"第二个商品",2.99,3.5,"这是第一个残品，是我学习angular入门创建的",["图书"]),
    new Product(3,"第三个商品",3.99,4.5,"这是第一个残品，是我学习angular入门创建的",["硬件产品"]),
    new Product(4,"第四个商品",4.99,1.5,"这是第一个残品，是我学习angular入门创建的",["电子产品","硬件产品"]),
    new Product(5,"第五个商品",5.99,2.5,"这是第一个残品，是我学习angular入门创建的",["电子产品"]),
    new Product(6,"第六个商品",6.99,3.5,"这是第一个残品，是我学习angular入门创建的",["图书"]),
];

const comments: Comment[] = [
    new Comment(1,1,"2017-02-02 22:22:22","张三", 4, "东西不错"),
    new Comment(2,1,"2017-03-02 20:22:22","历史", 3, "东西很不错"),
    new Comment(3,1,"2017-04-02 18:22:22","网路", 2, "东西页不错"),
    new Comment(4,2,"2017-05-02 16:22:22","找楼", 4, "东西真不错"),
];


app.use('/',express.static(path.join(__dirname,'..','clant')));

app.get('/api/products',(req,res) => {
    let result = products;
    let params = req.query;

    if(params.title){
        result = result.filter((p) => p.title.indexOf(params.title) !== -1);
    }

    if(params.price && result.length > 0){
        result = result.filter((p) => p.price <= parseInt(params.price));
    }

    if(params.category !== "-1" && result.length > 0){
        result = result.filter((p) => p.category.indexOf(params.category) !== -1);
    }

    res.json(result);
})

app.get('/api/products/:id',(req,res) => {
    res.json(products.find((product) => product.id == req.params.id));
})

app.get('/api/products/:id/comments',(req,res) => {
    res.json(comments.filter((comment: Comment) => comment.productId == req.params.id));
})

const server = app.listen(8000,"localhost",()=> {
    console.log("服务器已启动，地址是：http://localhost:8000");
})

const subscriptions = new Map<any, number[]>();

const wsServer = new Server({port:8085});
wsServer.on("connection",webSocket => {
    webSocket.send("这个消息是服务器主动推送的");
    webSocket.on('message',message => {
        let messageObj = JSON.parse(message);
        let productIds = subscriptions.get(webSocket);
        subscriptions.set(webSocket, [...productIds, messageObj.productId]);
    })
})

const currentBids = new Map<number,number>();

setInterval(() => {
    products.forEach( p => {
        let currentBid = currentBids.get(p.id) || p.price;
        let newBid = currentBid + Math.random() * 5;
        currentBids.set(p.id,newBid);
    });

    subscriptions.forEach((productIds: number[], ws) => {
        let newBinds = productIds.map(pid => ({
            productId: pid,
            bid:currentBids.get(pid)
        }))
        ws.send(JSON.stringify(newBinds));
    });
},2000)